﻿#pragma once
#include <mutex>

struct AVFrame;
/// <summary>
/// 视频渲染接口类
/// 隐藏渲染方案，此接口可以有不同的渲染方案实现
/// </summary>
class IVideoRenderView
{

public:
	enum PixFormat
	{
		RGBA = 0,
		ARGB,
		RGB24,
		YUV420P,
		NV12,
	};

	enum RenderType {
		SDL = 0,//使用SDL渲染
	};
	static IVideoRenderView* Create(RenderType type = SDL);
	////////////////////////////////////////////////
		/// 初始化渲染窗口 线程安全 可多次调用
		/// @para w 窗口宽度
		/// @para h 窗口高度
		/// @para fmt 绘制的像素格式
		/// @para win_id 窗口句柄，如果为空，创建新窗口
		/// @return 是否创建成功
	virtual bool Init(int w, int h,
		IVideoRenderView::PixFormat fmt,
		void* win_id = nullptr) = 0;

	//清理所有申请的资源，包括关闭窗口
	virtual void Close() = 0;

	//处理窗口退出事件
	virtual bool IsExit() = 0;

	//////////////////////////////////////////////////
	/// 渲染图像 线程安全
	///@para data 渲染的二进制数据
	///@para linesize 一行数据的字节数，对于YUV420P就是Y一行字节数
	/// linesize<=0 就根据宽度和像素格式自动算出大小
	/// @return 渲染是否成功
	virtual bool Draw(char* data) = 0;

	virtual bool DrawFrame(AVFrame *frame) = 0;
	int RenderFps() { return m_render_fps; };

	//显示缩放
	void Scale(int w, int h)
	{
		m_scale_width = w;
		m_scale_height = h;
	}
protected:
	int m_width = 0;     //材质宽高
	int m_height = 0;
	PixFormat m_pix_fmt = RGBA;  //像素格式
	std::mutex m_mutex;    //确保线程安全
	int m_scale_width = 0;   //显示大小
	int m_scale_height = 0;
	int m_render_fps = 0;
	int m_count = 0;              //统计显示次数
	long long m_beg_ms = 0;       //计时开始时间
};
